//#include "myfilelog.hxx"
//#include "loghelper.hxx"
//#include "priv/cacherdb.hxx"
//#include "udpsocketexception.hxx"
//#include "udpserversocket.hxx"
//#include "bridgemessage.hxx"
//#include "udpbridgenet.hxx"
//#include "priv/udplistener.hxx"
//
//UdpListener::UdpListener(tUInt32 uport,FileLog* filelog)
//	:	Thread(),
//		_uport(uport),
//		_omsg_que(),
//		_omsg(NULL),
//		_is_shutdown_requested(FALSE),
//		_filelog(filelog)
//{}
//
//UdpListener::~UdpListener()
//{}
//void UdpListener::Shutdown(void)
//{
//	_is_shutdown_requested = TRUE;
//}
//void UdpListener::Execute(Thread::Arg arg)
//{
//  UdpServerSocket* udp_socket=0;
//  tBool isbusy;
//  tUInt32 counter=0;
//  //tSInt64 starttime;
//  //tSInt64 endtime;
//  
//
//  BridgeNet::tBridgeNetStatus status;
//  tBridgeMsg* bmsg;
//
//  //starttime=Timer::GetAbsoluteTime();
//  
//  LOGINFO("UdpListener starting up...");
//
//  try
//  {
//	  udp_socket = new UdpServerSocket(_uport);
//  }
//  catch(UdpSocketException &e)
//  {
//	  LOGINFO("UdpListener::Execute:Failed to instantiate the Udp socket,exception:"<<e.Description()<<".");
//	  if (udp_socket) 
//	  {
//		  udp_socket->Close();
//		  delete udp_socket;
//	  }
//	  return;
//  }
//
//  UdpBridgeNet* bridgenet = new UdpBridgeNet(_filelog);
//  bridgenet->SetUdpSocket(udp_socket);
//  
//  while(!_is_shutdown_requested)
//  {
//	  isbusy = FALSE;
//
//	  /* Processing Incomming Msg.*/
//	  status = bridgenet->ReceiveMsg(&bmsg);
//
//	  switch(status)
//	  {
//	  case BridgeNet::eMsgAvailable:
//		  ProcessIMsg(bmsg);
//		  bmsg = NULL;
//		  isbusy = TRUE;
//		  break;
//	  default:
//		  break;		  
//	  }
//
//	  /* Processing outgoing Msg.*/
//	  if (_omsg || ( _omsg = _omsg_que.Pop()))
//	  {
//		  if (bridgenet->IsReadyForWrite())
//		  {
//			  if (bridgenet->SendBridgeMsg(_omsg))
//			  {
//				  ReleaseBridgeMsg(_omsg);
//			  }
//
//			  isbusy = TRUE;
//		  }
//	  }
//
//	  if (!isbusy)
//		  Thread::Yield();
//  }
//
//  LOGDEBUG("UdpListener::Execute:Shutdown signal received.shutting down...");
//
//  udp_socket->Close();
//  delete udp_socket;
//  udp_socket = NULL;
//
//  delete bridgenet;
//  bridgenet = NULL;
//
//  ReleaseBridgeMsg(_omsg);
//
//  while (_omsg=_omsg_que.Pop())
//  {
//	  ReleaseBridgeMsg(_omsg);
//  }
//
//  LOGINFO("UdpListener shutdowned.");
//}
//void UdpListener::ProcessIMsg(tBridgeMsg* imsg)
//{
//	switch (imsg->tom)
//	{
//	case E_WAS_MSG_ENDPOINTS_REGISTER_REQ:
//		ProcessIMsgRegisterUdpEndpoint(imsg);
//		break;
//	default:
//		break;
//	}
//}
//
///**
// * 1) store the PHole info(the UdpEndpoints)
// * 2) create a confirm msg answering peer.
// */
//void UdpListener::ProcessIMsgRegisterUdpEndpoint(tBridgeMsg* imsg)
//{
//	tUInt32 public_port=0;
//	tUInt32 internal_port=0;
//	tUInt32 id=0;
//	tBridgeMsg* omsg;
//	tByte* msg;
//	tUInt32 len;
//	tUInt32 rspc = X_WAS_RSPC_NONE;
//
//	tChar* id_str = GetDataFromMsg(imsg,E_WAS_TAG_ID_MYID);
//	tChar* internal_port_str = GetDataFromMsg(imsg,E_WAS_TAG_ID_IPOT);
//
//	if (id_str)				id=atoi(id_str);
//	if (internal_port_str)	internal_port = atoi(internal_port_str);
//
//	if (!id || !(imsg->rport) || !internal_port)
//	{
//		LOGWARNING("UdpListener::ProcessIMsgRegisterUdpEndpoint:Failed to extract enough info from PHole msg.");
//		rspc = X_WAS_RSPC_BAD_REQUEST;
//	}
//	else
//	{
//		LOGDEBUG("UdpListener::ProcessIMsgRegisterUdpEndpoint:Info in the PHole msg:id="<<id<<",public_port="<<imsg->rport<<",internal_port="<<internal_port<<".");
//
//		if (CacherDB::GetInstance()->SetPTUdpEndpoint(id,imsg->rport,internal_port))
//		{
//			rspc = X_WAS_RSPC_OK;
//		}
//		else
//		{
//			rspc = X_WAS_RSPC_MEMBER_UNAVAILABLE;
//		}
//	}
//
//	msg = was_write_msg(&len, E_WAS_MSG_FIRST_PART, E_WAS_MSG_ENDPOINTS_REGISTER_CNF,imsg->tid, rspc, 
//							E_WAS_TAG_ID_NONE);
//	
//	if (!msg)
//	{
//		LOGWARNING("UdpListener::ProcessIMsgRegisterUdpEndpoint:Error happened while was_write_msg(...).");
//		return;
//	}
//
//	omsg = new tBridgeMsg();
//
//	omsg->tid = imsg->tid;
//	omsg->rspc = rspc;
//	omsg->msg = msg;
//	omsg->tom = E_WAS_MSG_ENDPOINTS_REGISTER_CNF;
//	omsg->mpi = E_WAS_MSG_FIRST_PART;
//	omsg->lom = len;
//
//	omsg->rhost = imsg->rhost;
//	omsg->rport = imsg->rport;
//
//	_omsg_que.Push(omsg);
//
//	ReleaseBridgeMsg(imsg);
//}